package com.itany.corejava.code13_jdbc;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年12月11日 10:58
 */
public class Test01_快速入门 {
    private static final String JDBC_URL="jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8";

    public static void main(String[] args) {

        //添加用户
        User user=new User("tom","123456","15865954851","江苏-扬州");
        insertUser(user);

        //查询用户
        // List<User> list=selectAll();
        // for(User u:list){
        //     System.out.println(u);
        // }

        //修改用户
        // User user=new User(1,"huahua","12345678","15865958888","江苏-无锡");
        // updateUser(user);


        //删除用户
        // deleteUserById(1);
    }

    /**
     * 添加用户信息
     * @param user
     */
    public static void insertUser(User user){
        Connection connection=null;
        Statement st=null;

        try {
            // 1.注册驱动，由数据库厂商提供的驱动
            // 根据数据库类型不同、版本不同，驱动所在包名和类名有可能不同
            // MySQL5版本
            // 注册驱动是通过反射来实现
            // Class.forName("包名.类名")来注册驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 2.获得连接，连接到指定的数据库中，由数据库厂商提供了连接方式
            // 参数一:连接到数据库的url地址，对于MySQL而言，url格式地址为:   jdbc:mysql://mysql服务的ip地址:端口号/库名
            // ip地址指的是MySQL服务器所在的计算机的ip地址，可以使用本地址：127.0.0.1或者localhost
            // 端口号默认为:3306
            // 在java访问数据库时候，有可能会出现乱码，在url末尾指定编码?useUnicode=true&characterEncoding=utf-8
            // 参数二: MySQL的账号
            // 参数三: MySQL的密码

            connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8","root","root");

            // 3.获取状态集，用于操作数据库
            st=connection.createStatement();

            // 4.执行sql
            String sql="insert into t_user (username,password,phone,address) values ('"+user.getUsername()+"','"+user.getPassword()+"','"+user.getPhone()+"','"+user.getAddress()+"')";

            //5.执行DML操作，即：增删改查,返回值：受到影响的数据的行数
            int row=st.executeUpdate(sql);
            System.out.println(row+"rows affected");


        } catch (ClassNotFoundException e) {
            System.out.println("找不到驱动");

            e.printStackTrace();

        } catch (SQLException e) {
            System.out.println("数据库访问失败");
            e.printStackTrace();

        }finally {
            //释放资源
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    System.out.println("释放资源出错");
                    e.printStackTrace();
                }
            }
            if(st!=null){
                try {
                    st.close();
                } catch (SQLException e) {
                    System.out.println("释放资源出错");
                    e.printStackTrace();
                }
            }
        }


    }


    /**
     * 查询所有用户
     * @return
     */
    public static List<User> selectAll(){
        Connection connection=null;
        Statement st=null;
        ResultSet rs=null;
        List<User> users=new ArrayList<>();
        try {
            // 1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 2.获取连接
            connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8","root","root");

            // 3.获取状态集
            st=connection.createStatement();

            // 4.执行sql
            String sql="select id,username,password,phone,address from t_user";

            //5.执行查询操作,返回值是查询的结果集，在JDBC中，数据库查询的结果集由数据库厂商封装成了ResultSet类型
            rs=st.executeQuery(sql);


            // 6.处理结果集，需要将数据库查询的结果集映射成Java对象
            // 查询的每一行数据映射成一个对象
            // 如果存在多行数据，映射的就是一个Java对象集合
            // ResultSet中有一个next方法，用于获取下一行数据，判断下一行是否有数据，如果有数据，则将这一行数据映射成一个对象
            while(rs.next()){
                User user=new  User();
                // getXXX(int columnIndex) 或者 getXXX（String coulumnLabel）来进行转换
                // getXXX(int columnIndex)：获取第几列的数据
                // getXXX（String coulumnLabel）：根据指定列名获取对应的数据
                // 开发中字段可能比较多，因此如果使用第几列容易混乱，建议使用列名

                //将次一列的数据转换成Java中的int类型
                int id=rs.getInt(1);
                user.setId(id);
                String username=rs.getString("username");
                user.setUsername(username);
                String password=rs.getString("password");
                user.setPassword(password);
                String phone=rs.getString("phone");
                user.setPhone(phone);
                String address=rs.getString("address");
                user.setAddress(address);

                //查询结果可能包含很多行数据，每一行数据对应一个User对象
                // 使用集合来添加这些User对象
                users.add(user);


            }






        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //释放资源
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    System.out.println("释放资源出错");
                    e.printStackTrace();
                }
            }
            if(st!=null){
                try {
                    st.close();
                } catch (SQLException e) {
                    System.out.println("释放资源出错");
                    e.printStackTrace();
                }
            }
        }

        return users;
    }

    /**
     * 修改用户信息
     * @param user
     */
    public static void updateUser(User user){
        Connection connection=null;
        Statement st=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection=DriverManager.getConnection(JDBC_URL,"root","root");
            st=connection.createStatement();
            String sql="update t_user set username='"+user.getUsername()+"',password='"+user.getPassword()+"',phone='"+user.getPhone()+"',address='"+user.getAddress()+"' where id='"+user.getId()+"'";
            int row=st.executeUpdate(sql);
            System.out.println(row+" rows affected");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除用户
     * @param id
     */
    public static void deleteUserById(Integer id){
        Connection connection=null;
        Statement st=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection=DriverManager.getConnection(JDBC_URL,"root","root");
            st=connection.createStatement();
            String sql="delete from t_user where id="+id;
            int row=st.executeUpdate(sql);
            System.out.println(row+" rows affected");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}
